package com.spring.lesson001.demo12.cglib.eg1;

import org.junit.Test;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author vhans
 */
public class CglibTest {
    @Test
    public void test1() {
        // 使用Enhancer类创建某个类的代理类，步骤如下：
        // 1.创建Enhancer对象
        Enhancer enhancer = new Enhancer();

        // 2.通过setSuperclass来设置父类型，即需要给哪个类创建代理类
        enhancer.setSuperclass(Service1.class);

        /* 3.设置回调，需实现org.springframework.cglib.proxy.Callback接口，
        此处使用org.springframework.cglib.proxy.MethodInterceptor,也是一个接口实现了Callback,
        当调用代理对象的任何方法的时候，都会被MethodInterceptor接口的intercept方法处理
         */
        enhancer.setCallback(new MethodInterceptor() {
            /**
             * 代理对象拦截器
             * @param o 代理对象
             * @param method 被代理类的方法
             * @param objects 方法参数
             * @param methodProxy 方法代理对象
             */
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("调用方法:" + method);
                return methodProxy.invokeSuper(o, objects);
            }
        });

        // 4.获取代理对象
        Service1 proxy = (Service1) enhancer.create();

        // 5.调用方法
        proxy.m1();
        proxy.m2();
    }
}
